// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2024-07-18

package src

import (
	"gitee.com/go-libs/config"
)

// Config
// is a singleton instance for console configuration.
var Config *Configuration

// Configuration
// is a component used to configure console variables.
type Configuration struct {
	err      error
	Commands map[string]*CommandConfig `yaml:"commands" json:"commands"`
}

// GetCommand
// returns a command configuration if define in config file.
func (o *Configuration) GetCommand(name string) *CommandConfig {
	if cmd, ok := o.Commands[name]; ok {
		return cmd
	}
	return nil
}

// +---------------------------------------------------------------------------+
// | Event methods                                                             |
// +---------------------------------------------------------------------------+

// After
// is an event handler used to be called in config-file manager.
func (o *Configuration) After() {
	// Build init commands.
	if o.Commands == nil {
		o.Commands = make(map[string]*CommandConfig)
	}

	// Depth initializer.
	for _, cmd := range o.Commands {
		cmd.After()
	}
	return
}

// +---------------------------------------------------------------------------+
// | Access methods                                                            |
// +---------------------------------------------------------------------------+

func (o *Configuration) init() *Configuration {
	// Scan
	// config fields from yaml file.
	o.err = config.Seek("console.yml", "console.yaml").ScanYaml(o)
	return o
}
